package br.org.ifrr.controller;

import java.awt.Image;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ImageIcon;
import javax.validation.constraints.NotNull;

import org.hibernate.Session;

import br.org.ifrr.model.Gestor;
import br.org.ifrr.model.Grupo;
import br.org.ifrr.repository.Gestores;
import br.org.ifrr.repository.Grupos;
import br.org.ifrr.util.jsf.FacesUtil;
import br.org.ifrr.util.report.ExecutorRelatorio;

@Named
@RequestScoped
public class RelatorioSetorBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private Gestor nomeSetor;

	@Inject
	private FacesContext facesContext;

	@Inject
	private HttpServletResponse response;

	@Inject
	private EntityManager manager;

	@Inject
	private Gestores gestores;

	@Inject
	private Grupos grupos;

	public void emitir() {

		Map<String, Object> parametros = new HashMap<>();

		Image logo = new ImageIcon(getClass().getResource(
				"/resources/images/brasao.jpg")).getImage();
		parametros.put("logo", logo);

		parametros.put("nome_setor", this.nomeSetor.getSetor());

		ExecutorRelatorio executor = new ExecutorRelatorio(
				"/relatorios/relatorio_setor.jasper", this.response,
				parametros, this.nomeSetor.getSetor() + " - "
						+ new SimpleDateFormat("dd/MM/yyyy").format(new Date())
						+ ".pdf");

		Session session = manager.unwrap(Session.class);
		session.doWork(executor);

		if (executor.isRelatorioGerado()) {
			facesContext.responseComplete();
		} else {

			FacesUtil.addErrorMessage("A execução do relatório não retornou dados.");
		}

	}

	@NotNull
	public Gestor getNomeSetor() {
		return nomeSetor;
	}

	public void setNomeSetor(Gestor nomeSetor) {
		this.nomeSetor = nomeSetor;
	}

	public List<Gestor> completarSetor(String setor) {
		return this.gestores.porSetor(setor);
	}

	public List<Grupo> completarGrupoDescricao(String grupoDescricao) {
		return this.grupos.porGrupoDescricao(grupoDescricao);
	}

}